/******************************************************************************* * Copyright (c) 2000, 2008 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.jdt.ui.tests.refactoring.typeconstraints; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import junit.framework.Test; import junit.framework.TestSuite; import org.eclipse.jdt.core.ICompilationUnit; import org.eclipse.jdt.core.IPackageFragment; import org.eclipse.jdt.core.dom.CompilationUnit; import org.eclipse.jdt.internal.corext.refactoring.typeconstraints.ASTCreator; import org.eclipse.jdt.internal.corext.refactoring.typeconstraints.ConstraintCollector; import org.eclipse.jdt.internal.corext.refactoring.typeconstraints.ConstraintOperator; import org.eclipse.jdt.internal.corext.refactoring.typeconstraints.ConstraintVariable; import org.eclipse.jdt.internal.corext.refactoring.typeconstraints.ConstraintVariableFactory; import org.eclipse.jdt.internal.corext.refactoring.typeconstraints.FullConstraintCreator; import org.eclipse.jdt.internal.corext.refactoring.typeconstraints.ITypeConstraint; import org.eclipse.jdt.internal.corext.refactoring.typeconstraints.TypeConstraintFactory; import org.eclipse.jdt.ui.tests.refactoring.RefactoringTest; import org.eclipse.jdt.ui.tests.refactoring.RefactoringTestSetup; public class TypeConstraintTests extends RefactoringTest { private static final Class clazz= TypeConstraintTests.class; private static final String PATH= "TypeConstraints/"; public TypeConstraintTests(String name) { super(name); } protected String getRefactoringPath() { return PATH; } public static Test suite() { return new RefactoringTestSetup(new TestSuite(clazz)); } public static Test setUpTest(Test someTest) { return new RefactoringTestSetup(someTest); } private String getSimpleTestFileName(){ return "A_" + getName() + ".java"; } private String getTestFileName(){ return TEST_PATH_PREFIX + getRefactoringPath() + getSimpleTestFileName(); } private ICompilationUnit createCUfromTestFile(IPackageFragment pack) throws Exception { return createCU(pack, getSimpleTestFileName(), getFileContents(getTestFileName())); } private CompilationUnit getCuNode() throws Exception { ICompilationUnit cu= createCUfromTestFile(getPackageP()); return ASTCreator.createAST(cu, null); } private void numberHelper(int number) throws Exception { CompilationUnit cuNode= getCuNode(); ConstraintCollector collector= getCollector(); cuNode.accept(collector); ITypeConstraint[] constraints= collector.getConstraints(); assertEquals(Arrays.asList(constraints).toString(), number, constraints.length); } public void testNumber0() throws Exception{ numberHelper(2); } public void testNumber1() throws Exception{ numberHelper(3); } public void testNumber2() throws Exception{ numberHelper(10); } private ConstraintCollector getCollector() { TypeConstraintFactory factory = new TypeConstraintFactory(){ public boolean filter(ConstraintVariable v1, ConstraintVariable v2, ConstraintOperator o){ return false; } }; ConstraintCollector collector= new ConstraintCollector(new FullConstraintCreator(new ConstraintVariableFactory(), factory)); return collector; } private static List allToStrings(Object[] elements) { String[] strings= new String[elements.length]; for (int i= 0; i < elements.length; i++) { strings[i]= elements[i].toString(); } return new ArrayList(Arrays.asList(strings));//want to be able to remove stuff from it } private void testConstraints(String[] constraintStrings) throws Exception{ CompilationUnit cuNode= getCuNode(); ConstraintCollector collector= getCollector(); cuNode.accept(collector); ITypeConstraint[] constraints= collector.getConstraints(); List externals= allToStrings(constraints); assertEquals("length", constraintStrings.length, constraints.length); for (int i= 0; i < constraintStrings.length; i++) { assertTrue("missing constraint:" + constraintStrings[i], externals.remove(constraintStrings[i])); } } public void testConstraints0() throws Exception{ String[] strings= {"[null] <= [a0]", "[a0] <= [a1]", "[a0] =^= A", "[a1] =^= A", "Decl(A:f()) =^= p.A"}; testConstraints(strings); } public void testConstraints1() throws Exception{ String[] strings= {"[null] <= [a0]", "[a0] == [a1]", "[a0] =^= A", "[a1] =^= A", "Decl(A:a0) =^= p.A", "Decl(A:a1) =^= p.A"}; testConstraints(strings); } public void testConstraints2() throws Exception{ String[] strings= {"[null] <= [a0]", "[(A)a0] =^= A", "[(A)a0] <= [a1]", "[a0] <= [(A)a0] or [(A)a0] <= [a0]", "[a0] =^= A", "[a1] =^= A", "Decl(A:f()) =^= p.A"}; testConstraints(strings); } public void testConstraints3() throws Exception{ String[] strings= {"[null] <= [a]", "[null] <= [b]", "[a] == [b]", "[a] =^= A", "[b] =^= A", "Decl(A:f()) =^= p.A"}; testConstraints(strings); } public void testConstraints4() throws Exception{ String[] strings= {"[as0] =^= A[]", "[a0] <= A", "[{a0}] <= [as0]", "Decl(A:f()) =^= p.A", "[null] <= [a0]", "[a0] =^= A"}; testConstraints(strings); } public void testConstraints5() throws Exception{ String[] strings= {"[as0] =^= A[]", "Decl(A:f()) =^= p.A", "[a0] <= A", "[a0] =^= A", "[null] <= [a0]", "[new A[]{a0}] <= [as0]"}; testConstraints(strings); } public void testConstraints6() throws Exception{ String[] strings= {"Decl(A:f()) =^= p.A", "Decl(A:A(A)) =^= p.A", "[new A(a0)] =^= p.A", "[a0] <= [Parameter(0,A:A(A))]", "[a1] =^= A", "[a] =^= A", "[a0] =^= A", "[null] <= [a0]", "[new A(a0)] <= [a1]", "[Parameter(0,A:A(A))] =^= [a]"}; testConstraints(strings); } public void testConstraints7() throws Exception{ String[] strings= {"Decl(A:A()) =^= p.A", "Decl(A:A(A)) =^= p.A", "[null] <= [Parameter(0,A:A(A))]", "[Parameter(0,A:A(A))] =^= [a]", "[a] =^= A"}; testConstraints(strings); } public void testConstraints8() throws Exception{ String[] strings= {"Decl(A:x) =^= p.A", "Decl(A:f()) =^= p.A", "[x] =^= java.lang.Object", "Decl(A:aField) =^= p.A", "[this] <= [x]", "[aField] =^= A", "[x] =^= Object", "[this] =^= p.A", "[aField] <= Decl(A:x)"}; testConstraints(strings); } public void testConstraints9() throws Exception{ String[] strings= {"Decl(A:f()) =^= p.A", "[a] =^= A", "[x] =^= boolean", "[a instanceof A] <= [x]", "[null] <= [a]", "[a] <= A or A <= [a]"}; testConstraints(strings); } public void testConstraints10() throws Exception{ String[] strings= {"[null] <= [A:f1()]_returnType", "Decl(A:f1()) =^= p.A", "[A:f1()]_returnType =^= A[]"}; testConstraints(strings); } public void testConstraints11() throws Exception{ String[] strings= {"[null] <= [A:f(A, Object)]_returnType", "[Parameter(1,B:f(A, Object))] =^= [a4]", "[B:f(A, Object)]_returnType =^= A", "Decl(B:f(A, Object)) < Decl(A:f(A, Object))", "[Parameter(1,A:f(A, Object))] == [Parameter(1,B:f(A, Object))]", "[Parameter(0,A:f(A, Object))] == [Parameter(0,B:f(A, Object))]", "[A:f(A, Object)]_returnType == [B:f(A, Object)]_returnType", "[Parameter(0,B:f(A, Object))] =^= [a3]", "[Parameter(0,A:f(A, Object))] =^= [a0]", "Decl(A:f(A, Object)) =^= p.A", "[null] <= [B:f(A, Object)]_returnType", "[Parameter(1,A:f(A, Object))] =^= [a1]", "[A:f(A, Object)]_returnType =^= A", "Decl(B:f(A, Object)) =^= p.B", "[a3] =^= A", "[a0] =^= A", "[a1] =^= Object", "[a4] =^= Object"}; testConstraints(strings); } public void testConstraints12() throws Exception{ String[] strings= { "Decl(B:f(A, Object)) =^= p.B", "[Parameter(1,B:f(A, Object))] =^= [a4]", "[B:f(A, Object)]_returnType =^= A", "[null] <= [B:f(A, Object)]_returnType", "[A:f(A, Object)]_returnType =^= A", "[Parameter(1,A:f(A, Object))] =^= [a1]", "Decl(A:f(A, Object)) =^= p.A", "[Parameter(0,B:f(A, Object))] =^= [a3]", "[null] <= [A:f(A, Object)]_returnType", "[Parameter(0,A:f(A, Object))] =^= [a0]", "[a3] =^= A", "[a0] =^= A", "[a1] =^= Object", "[a4] =^= Object" }; testConstraints(strings); } public void testConstraints13() throws Exception{ String[] strings= {"Decl(B:f(A, Object)) =^= p.B", "[Parameter(1,B:f(A, Object))] =^= [a4]", "[B:f(A, Object)]_returnType =^= A", "[null] <= [B:f(A, Object)]_returnType", "[A:f(A, Object)]_returnType =^= A", "[Parameter(1,A:f(A, Object))] =^= [a1]", "Decl(A:f(A, Object)) =^= p.A", "[Parameter(0,B:f(A, Object))] =^= [a3]", "[null] <= [A:f(A, Object)]_returnType", "[Parameter(0,A:f(A, Object))] =^= [a0]", "[a3] =^= A", "[a0] =^= A", "[a1] =^= Object", "[a4] =^= Object"}; testConstraints(strings); } public void testConstraints14() throws Exception{ String[] strings= {"[A:f(A)]_returnType == [B:f(A)]_returnType", "[Parameter(0,A:f(A))] == [Parameter(0,B:f(A))]", "[B:f(A)]_returnType =^= A", "Decl(B:f(A)) < Decl(A:f(A))", "[A:f(A)]_returnType =^= A", "Decl(B:f(A)) < Decl(I:f(A))", "[null] <= [A:f(A)]_returnType", "[Parameter(0,A:f(A))] =^= [a0]", "[I:f(A)]_returnType =^= A", "Decl(A:f(A)) =^= p.A", "[ax] =^= B", "[Parameter(0,B:f(A))] =^= [a3]", "[null] <= [B:f(A)]_returnType", "[a3] <= [Parameter(0,B:f(A))]", "[ax.f(a3)] =^= [B:f(A)]_returnType", "[ax] <= Decl(I:f(A)) or [ax] <= Decl(A:f(A))", "Decl(B:f(A)) =^= p.B", "[I:f(A)]_returnType == [B:f(A)]_returnType", "[Parameter(0,I:f(A))] == [Parameter(0,B:f(A))]", "[null] <= [ax]", "[Parameter(0,I:f(A))] =^= [ai]", "Decl(I:f(A)) =^= p.I", "[a3] =^= A", "[a0] =^= A", "[ai] =^= A"}; testConstraints(strings); } public void testConstraints15() throws Exception{ String[] strings= {"[Parameter(0,A:f(A))] =^= [a0]", "[I:f(A)]_returnType == [B:f(A)]_returnType", "[Parameter(0,I:f(A))] == [Parameter(0,B:f(A))]", "[null] <= [A:f(A)]_returnType", "[A:f(A)]_returnType == [B:f(A)]_returnType", "[Parameter(0,A:f(A))] == [Parameter(0,B:f(A))]", "Decl(B:f(A)) < Decl(A:f(A))", "[super.f(a3)] =^= [A:f(A)]_returnType", "Decl(A:f(A)) =^= p.A", "[null] <= [B:f(A)]_returnType", "[Parameter(0,I:f(A))] =^= [ai]", "[Parameter(0,B:f(A))] =^= [a3]", "[A:f(A)]_returnType =^= A", "Decl(B:f(A)) =^= p.B", "Decl(I:f(A)) =^= p.I", "Decl(B:f(A)) < Decl(I:f(A))", "[a3] <= [Parameter(0,A:f(A))]", "[I:f(A)]_returnType =^= A", "[B:f(A)]_returnType =^= A", "[a3] =^= A", "[a0] =^= A", "[ai] =^= A"}; testConstraints(strings); } public void testConstraints16() throws Exception{ String[] strings= {"Decl(A:aField) =^= p.A", "Decl(A:f()) =^= p.A", "[this] =^= p.A", "[this] =^= p.A", "[this] <= [aTemp]", "[this] <= [aField]", "[this] <= [a]", "[a] =^= A", "[aField] =^= A", "[aTemp] =^= A", "[this] =^= p.A"}; testConstraints(strings); } public void testConstraints17() throws Exception{ String[] strings= {"Decl(A:f()) =^= p.A", "[null] <= [a]", "[A:f()]_returnType =^= A", "[a] =^= A", "[a] <= [A:f()]_returnType"}; testConstraints(strings); } public void testConstraints18() throws Exception{ String[] strings= {"[Parameter(0,B:B(A))] =^= [a1]", "Decl(B:B(A)) =^= p.B", "[Parameter(0,A:A(A))] =^= [a0]", "Decl(A:A(A)) =^= p.A", "[a1] <= [Parameter(0,A:A(A))]", "[a1] =^= A", "[a0] =^= A"}; testConstraints(strings); } public void testConstraints19() throws Exception{ String[] strings= {"[aField] =^= p.A", "[a] =^= A", "Decl(B:f()) =^= p.B", "[a] <= [aField]", "[null] <= [a]", "Decl(A:aField) =^= p.A", "[aField] =^= A"}; testConstraints(strings); } public void testConstraints20() throws Exception{ String[] strings= {"Decl(B:aField) =^= p.B", "Decl(A:aField) =^= p.A", "Decl(B:aField) < Decl(A:aField)", "[aField] =^= A", "[aField] =^= A"}; testConstraints(strings); } public void testConstraints21() throws Exception{ String[] strings= {"Decl(A:f2(A[])) =^= p.A", "[Parameter(0,A:f2(A[]))] =^= [as]", "[as] =^= A[]"}; testConstraints(strings); } public void testConstraints22() throws Exception{ String[] strings= {"[null] <= [A:f(A, Object)]_returnType", "[Parameter(0,A:f(A, Object))] =^= [a0]", "[Parameter(1,A:f(A, Object))] =^= [a1]", "[A:f(A, Object)]_returnType =^= A", "Decl(A:f(A, Object)) =^= p.A", "[a1] =^= Object", "[a0] =^= A"}; testConstraints(strings); } public void testConstraints23() throws Exception{ //test for bug 41271 NullPointerException dumping set of ITypeConstraints to System.out String[] strings= {"[args.length] =^= int", "[0] <= [i]", "[i] =^= int", "[args] <= Decl((array type):length)", "[args] =^= String[]", "[Parameter(0,Test1:main(String[]))] =^= [args]", "Decl(Test1:main(String[])) =^= p.Test1"}; testConstraints(strings); } }